﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;
using System.ComponentModel;

namespace InspectionPageFlow
{
    [Designer(typeof(AfficherPageDesigner))]
    public sealed class AfficherPageActivity : NativeActivity<NavigationAction>
    {
        public InArgument<string> NomEtape { get; set; }
        public InArgument<string> UrlPage { get; set; }
        public InArgument<bool> CreerBookmark { get; set; }
        public InOutArgument<object> Donnees { get; set; }

        // Doit retourner vrai pour permettre à l'activité de passer au mode Idle
        protected override bool CanInduceIdle
        {
            get
            {
                return true;
            }
        }
        
        protected override void Execute(NativeActivityContext context)
        {
            // Extraction des arguments d'entrée
            string nomEtape = this.NomEtape.Get(context);
            string urlPage = this.UrlPage.Get(context);
            bool creerBookmark = this.CreerBookmark.Get(context);

            if (urlPage == null)
            {
                throw new ArgumentException(
                    string.Format("UrlPage {0}: UrlPage ne peut être null", 
                                  this.DisplayName), "UrlPage");
            }
            if (nomEtape == null)
            {
                throw new ArgumentException(
                    string.Format("NomEtape {0}: NomEtape ne peut être null", 
                                  this.DisplayName), "NomEtape");
            } 
          
            PageNavigationExtension extension = 
                context.GetExtension<PageNavigationExtension>();
            extension.UrlPage = urlPage;
            extension.Donnees = Donnees.Get(context);

            if (creerBookmark)
                context.CreateBookmark(nomEtape, new BookmarkCallback(ResumerBookmark));
        }

        void ResumerBookmark(NativeActivityContext context, Bookmark bookmark, object state)
        {
            NavigationAction action = (NavigationAction)state;

            // Si on résume le workflow, on réexécute l'activité courante
            if (action == NavigationAction.Resume)
                Execute(context);
            else
            {
                PageNavigationExtension extension = context.GetExtension<PageNavigationExtension>();
                context.SetValue(base.Result, action);
                context.SetValue(Donnees, extension.Donnees);
            }
        }
    }
}
